#pragma once
#include "noncopyable.h"

#include <functional>
#include <string>
#include <vector>
#include <memory>

class EventLoop;
class EventLoopThread;

class EventLoopThreadPool : noncopyable
{
public:
    using ThreadInitCallback = std::function<void(EventLoop*)>; // 定义初始化回调类型

    EventLoopThreadPool(EventLoop *baseLoop, const std::string &nameArg);
    ~EventLoopThreadPool();

    void setThreadNum(int numThreads) { numThreads_ = numThreads; }  // 设置线程数量

    void start(const ThreadInitCallback &cb = ThreadInitCallback());  // 启动线程池

    // 如果工作在多线程中，baseLoop_默认以轮询的方式分配channel给subloop
    EventLoop* getNextLoop();  // 获取下一个EventLoop

    std::vector<EventLoop*> getAllLoops(); // 获取所有的EventLoop

    bool started() const { return started_; } // 检查是否已启动
    const std::string name() const { return name_; } // 返回线程池的名称
private:

    EventLoop *baseLoop_; // 主EventLoop,通常不处理IO,仅用于解释新连接
    std::string name_; // 线程池名称
    bool started_; // 是否已启动
    int numThreads_; // 线程数量
    int next_; // 用于轮询选择EventLoop
    std::vector<std::unique_ptr<EventLoopThread>> threads_; // 管理线程的vector
    std::vector<EventLoop*> loops_; // 存储所有EventLoop的vector
}; 